package com.example.leavemanagement.service.impl;


import com.example.leavemanagement.model.entity.ChatRoom;
import com.example.leavemanagement.service.ChatService;
import com.example.leavemanagement.utils.AiManager;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessage;
import com.volcengine.ark.runtime.model.completion.chat.ChatMessageRole;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class ChatServiceImpl implements ChatService {

    @Resource
    private AiManager aiManager;

    // 全局消息映射
    final Map<Long, List<ChatMessage>> globalMessagesMap = new HashMap<>();

    /**
     * 聊天
     *
     * @param roomId  聊天室 id
     * @param message 用户自己输入的消息
     * @return
     */
    @Override
    public String doChat(long roomId, String message) {
        // 系统预设
        final String systemPrompt = "# 角色\n" +
                "你是一位专业且热情的“智逸人事”项目介绍员，致力于为使用该系统的用户提供全面、免费的解答服务。在用户咨询时，先整体介绍产品概况，再依据用户具体需求精准作答。\n" +
                "\n" +
                "## 技能\n" +
                "### 技能 1: 介绍产品总体情况\n" +
                "直接依据给定的产品说明书内容，向用户阐述“智逸人事管理系统”的总体情况，涵盖产品概述、核心功能模块、系统特色及典型使用场景等方面。\n" +
                "\n" +
                "### 技能 2: 解答用户具体需求\n" +
                "1. 仔细分析用户问题，判断涉及产品的具体板块。\n" +
                "2. 从产品说明书相应部分提取关键信息，组织语言为用户提供准确清晰的回答。\n" +
                "\n" +
                "### 技能 3: 提供额外信息\n" +
                "若用户有需要，可补充系统部署要求、API 接口详细说明、权限矩阵表、操作流程图解等内容。\n" +
                "\n" +
                "## 限制:\n" +
                "- 仅围绕“智逸人事”项目相关内容进行交流，拒绝回答无关问题。\n" +
                "- 输出内容需基于产品说明书，确保信息准确。\n" +
                "- 回答应简洁明了，符合逻辑。 ";
        // 1. 准备消息列表（关联历史上下文）
        final ChatMessage systemMessage = ChatMessage.builder().role(ChatMessageRole.SYSTEM).content(systemPrompt).build();
        final ChatMessage userMessage = ChatMessage.builder().role(ChatMessageRole.USER).content(message).build();

        List<ChatMessage> messages = new ArrayList<>();
        if ( !globalMessagesMap.containsKey(roomId)) {
            globalMessagesMap.put(roomId, messages);
            messages.add(systemMessage);
        } else {
            // 之后不用重复初始化，而是读取过去的消息列表
            messages = globalMessagesMap.get(roomId);
        }
        messages.add(userMessage);

        // 2. 调用 AI
        String answer = aiManager.doChat(messages);

        final ChatMessage assistantMessage = ChatMessage.builder().role(ChatMessageRole.ASSISTANT).content(answer).build();
        messages.add(assistantMessage);

        return answer;
    }

    /**
     * 获取聊天室列表
     *
     * @return
     */
    @Override
    public List<ChatRoom> getChatRoomList() {
        List<ChatRoom> chatRoomList = new ArrayList<>();
        for (Map.Entry<Long, List<ChatMessage>> roomIdMessageListEntry : globalMessagesMap.entrySet()) {
            ChatRoom chatRoom = new ChatRoom();
            chatRoom.setRoomId(roomIdMessageListEntry.getKey());
            chatRoom.setChatMessageList(roomIdMessageListEntry.getValue());
            chatRoomList.add(chatRoom);
        }
        return chatRoomList;
    }
}
